# -*- encoding: utf-8 -*-

"""
------------------------------------------
@File       : 2_queue.py
@Author     : maixiaochai
@Email      : maixiaochai@outlook.com
@CreatedOn  : 2021/12/14 15:14
------------------------------------------
    Python实现一个队列（目的是加强对队列的理解，Python自身有队列的数据结构）
"""


class MyQueue:
    def __init__(self, capacity):
        # capacity, 容量
        self.list = [None] * capacity
        self.front = 0
        # rear,后方,后面
        self.rear = 0

    def enqueue(self, element):
        # 入队
        if (self.rear + 1) % len(self.list) == self.front:
            raise Exception('队列已满')

        # 原先的队尾位置放入新元素
        # 为什么放入队尾位置而不是队尾后一位？
        # 用数组实现时，为了入队操作的方便，把队尾位置规定为最后入队元素的下一个位置，并且队尾指针指向的位置必须永远空着,
        # 所以，队列最大容量比数组长度小1
        self.list[self.rear] = element

        # 新的队尾位置向“后”移
        # 这里取余数，是使用循环队列时对rear(队尾)位置的计算
        self.rear = (self.rear + 1) % len(self.list)

    def dequeue(self):
        # 这里为啥会相等？在enqueue方法中不是已经限制住了吗？
        # 应该是Exception内容打错了，其内容应该为“队列为空”。因为按照MyQueue的初始定义和enqueue的条件限制，
        # 只有在初始化的时候，self.front和self.rear才能相等，这个时候队列是空的
        if self.rear == self.front:
            raise Exception('队列为空！')

        dequeue_element = self.list[self.front]
        self.front = (self.front + 1) % len(self.list)

        return dequeue_element

    def output(self):
        i = self.front
        while i != self.rear:
            print(self.list[i])
            i = (i + 1) % len(self.list)


def main():
    my_queue = MyQueue(6)
    my_queue.dequeue()
    print("assert")
    my_queue.enqueue(3)
    my_queue.enqueue(5)
    my_queue.enqueue(6)
    my_queue.dequeue()
    my_queue.dequeue()
    my_queue.enqueue(2)
    my_queue.enqueue(4)
    my_queue.output()


if __name__ == '__main__':
    main()
